﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PatientsManagement.Users;
using PatientsManagement.Database;

namespace PatientsManagement
{
    public partial class Login : Form
    {
        bool loginPressed = true;
        Validator validator;

        public Login()
        {
            InitializeComponent();
            Initialize();
        }

        private void Initialize()
        {
            userNameText.Text = "";
            passwordText.Text = "";
            userPassErrorProvider.SetIconPadding(userNameText, -18);
            userPassErrorProvider.SetIconPadding(passwordText, -18);
            validator = new Validator(userPassErrorProvider);
            userNameText.Text = "user5";//Do usuniecia
            passwordText.Text = "aaaaaa";//Do usuniecia
            validator.IsEmpty(userNameText, "Nazwa użytkownika nie może być pusta");
            validator.PasswordValidation(passwordText, "Hasło nie może być puste", "Hasło musi zawierać co najmniej 6 znaków");
        }

        public String UserName
        {
            get
            {
                return this.userNameText.Text;
            }
        }

        private void userNameText_Validating(object sender, CancelEventArgs e)
        {
            userInfo.Text = "Wprowadź poprawną nazwę użytkownika";
            validator.IsEmpty(sender, "Nazwa użytkownika nie może być pusta");
            userInfo.Visible = false;
        }

        private void passwordText_Validating(object sender, CancelEventArgs e)
        {
            validator.PasswordValidation(sender, "Hasło nie może być puste", "Hasło musi zawierać co najmniej 6 znaków");
            passInfo.Visible = false;
        }
        private void loginButton_Click(object sender, EventArgs e)
        {
            loginPressed = true;
            string name = UsersData.GetUserForenameSurname(UserName);
            
            string username = UserName;
            int userID = -1;
            bool hide = false;
            if (name != "notexistingusername")
            {
                string userType = UsersData.GetUserType(UserName);
                bool userIsAdmin = UsersData.IsAdmin(UserName);
                if (userType == "Lekarz" && name != "notexistingusername")
                    userID = UsersData.GetUserID(username);
                if (UsersData.IsActive(username))
                {
                    if (!(userType == "Lekarz" && !DoctorsData.LinkExists(userID)))
                    {
                        hide = HideLogin();
                    }
                    else
                    {
                        userInfo.Visible = true;
                        userInfo.Text = "Użytkownik nie został powiązany z danymi doktora.";
                    }
                }
                else
                {
                    userInfo.Visible = true;
                    userInfo.Text = "Konto jest nieaktywne.\r\nSkontaktuj się z administratorem w celu aktywacji.";
                }
                if (hide)
                {
                    Initialize();
                    this.Refresh();
                    this.Hide();

                    if (userType == "Admin")
                    {
                        ManageUsers manageUsers = new ManageUsers(username, name);
                        if (!(manageUsers.ShowDialog() == DialogResult.OK))
                            this.Close();
                    }
                    if (userType == "Recepcjonista/ka")
                    {
                        ManagePatients mainForm = new ManagePatients(userIsAdmin, username);
                        if (!(mainForm.ShowDialog() == DialogResult.OK))
                            this.Close();
                    }
                    if (userType == "Lekarz")
                    {
                        if (DoctorsData.LinkExists(userID))
                        {
                            ManageVisits manageVisits = new ManageVisits(username, userID);
                            if (!(manageVisits.ShowDialog() == DialogResult.OK))
                                this.Close();
                        }
                        else
                        {

                        }
                    }
                    if (!this.IsDisposed)
                        this.Show();
                }
            }
            else
            {
                userInfo.Visible = true;
                userInfo.Text = "Podany użytkownik nie istnieje";
            }
        }

        private void exit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void userNameText_TextChanged(object sender, EventArgs e)
        {
            validator.IsEmpty(sender, "Nazwa użytkownika nie może być pusta");
            userInfo.Visible = false;
        }

        private void passwordText_TextChanged(object sender, EventArgs e)
        {
            validator.PasswordValidation(passwordText, "Hasło nie może być puste", "Hasło musi zawierać co najmniej 6 znaków");
            passInfo.Visible = false;
        }

        private void createAccount_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            string text = this.Text;
            AddUser addUser = new AddUser(false);
            if (addUser.ShowDialog() == DialogResult.OK)
            {
                addUser.AddToDatabase();
            }
        }

        private void Login_FormClosing(object sender, FormClosingEventArgs e)
        {
            
        }

        private bool HideLogin()
        {
            bool status = true;
            if ((!(userPassErrorProvider.GetError(userNameText) == "" && userPassErrorProvider.GetError(passwordText) == "")) && loginPressed == true)
            {
                status = false;
                if (userPassErrorProvider.GetError(userNameText) != "")
                    userInfo.Visible = true;
                if (userPassErrorProvider.GetError(passwordText) != "")
                    passInfo.Visible = true;
            }
            if (loginPressed && !validator.ValidateUser(userNameText.Text) && userNameText.Text != "")
            {
                userInfo.Visible = true;
                userInfo.Text = "Podany użytkownik nie istnieje";
                status = false;
            }
            else
            {
                if (loginPressed && userNameText.Text != "" && userPassErrorProvider.GetError(passwordText) == "")
                {
                    if (!validator.CheckPassword(userNameText.Text, passwordText.Text))
                    {
                        passInfo.Visible = true;
                        status = false;
                    }
                }
            }
            return status;
        }
    }
}
